// 数据类型
using System;
namespace Typeofdata 
{
    class TypeofdataC
    {
        enum Days { Sun, Mon, tue, Wed, thu, Fri, Sat };   // 枚举列表中的每个符号代表一个整数值，一个比它前面的符号大的整数值。默认情况下，第一个枚举符号的值是 0

        struct Books
        {
            public string title;
            public string author;
            public string subject;
            public int book_id;
        };        
        static void Main(string[] args){
            // 值类型 - 整数类型
            sbyte a =1;  // 8位有符号整数
            short b =1; // 16位有符号整数
            int c =1; // 32位有符号整数
            long d = 1; // 64位有符号整数
            byte a1 = 2; // 8位无符号整数 0 -255 相当于一个字节（8位）
            ushort b1 = 2; // 16位无符号整数 0 -65535
            uint c1= 2; // 32位无符号整数 0 -4294967295
            ulong d1= 2; // 64位无符号整数   

            Console.WriteLine("a: {0}",a);
            Console.WriteLine(b);
            Console.WriteLine(c);
            Console.WriteLine(d);

            Console.WriteLine("a1: {0}",a1);
            Console.WriteLine(b1);
            Console.WriteLine(c1);
            Console.WriteLine(d1);

            // 值类型 - bool 类型
            bool boola = true;
            Console.WriteLine("bool {0}",boola);

            // 值类型 - 浮点 类型
            float floata = 3.2f;
            double doublea = 3.22; // 64位   
            decimal decimala = 123123.23m; // 128位
            Console.WriteLine("float {0}",floata);
            Console.WriteLine("double {0}",doublea); 
            Console.WriteLine("decimal {0}",decimala);

            // 值类型 - 字符类型
                // 以下命令指定 char 值
                // 字符文本。
                // Unicode 转义序列，它是 \u 后跟字符代码的十六进制表示形式（四个符号）。
                // 十六进制转义序列，它是 \x 后跟字符代码的十六进制表示形式。
            var chars = new[]
            {
                'j',
                '\u006A',
                '\x006A',
                (char)106,
            };
            Console.WriteLine(string.Join(" ", chars));  // output: j j j j
            // 值类型 - 结构体类型 
            Books Book1;        /* 声明 Book1，类型为 Books */
            Books Book2;        /* 声明 Book2，类型为 Books */

            /* book 1 详述 */
            Book1.title = "C Programming";
            Book1.author = "Nuha Ali";
            Book1.subject = "C Programming Tutorial";
            Book1.book_id = 6495407;

            /* book 2 详述 */
            Book2.title = "Telecom Billing";
            Book2.author = "Zara Ali";
            Book2.subject = "Telecom Billing Tutorial";
            Book2.book_id = 6495700;

            /* 打印 Book1 信息 */
            Console.WriteLine("Book 1 title : {0}", Book1.title);
            Console.WriteLine("Book 1 author : {0}", Book1.author);
            Console.WriteLine("Book 1 subject : {0}", Book1.subject);
            Console.WriteLine("Book 1 book_id :{0}", Book1.book_id);

            /* 打印 Book2 信息 */
            Console.WriteLine("Book 2 title : {0}", Book2.title);
            Console.WriteLine("Book 2 author : {0}", Book2.author);
            Console.WriteLine("Book 2 subject : {0}", Book2.subject);
            Console.WriteLine("Book 2 book_id : {0}", Book2.book_id); 

            // 值类型 - 枚举类型
            int x = (int)Days.Sun;
            int y = (int)Days.Fri;
            Console.WriteLine("枚举 Sun = {0}", x);
            Console.WriteLine("枚举 Fri = {0}", y);

            // 引用类型 - string
            string str1 = "\\\\122121";
            string str2 = @"\\\\122121";
            string str3 = $"{str1}{str2}";
            Console.WriteLine("string {0}",str1);
            Console.WriteLine("string {0}",str2);
            Console.WriteLine("string {0}",str3);

            // 引用类型 - object：可任意值
            object myObject; 
            myObject = "Hello, World!"; // 字符串类型
            Console.WriteLine(myObject);
            myObject = 42; // 整型
            Console.WriteLine(myObject);
            myObject = 3.14; // 双精度浮点型
            Console.WriteLine(myObject);

            // 引用类型 - dynamic
            dynamic number = "123";
            Console.WriteLine(number.Length); // 输出字符串长度
            
            number = 456;
            Console.WriteLine(number.GetType()); // 输出运行时类型
            
            dynamic mathOperations = new DynamicMath();
            Console.WriteLine(mathOperations.Add(10, 20)); // 调用DynamicMath类中的Add方法
            // 引用类型 - 接口（命名I开头）
            // 引用类型 - 类
            // 可空类型 Nullable
            int? i = null;
            double? ii = new double?();
            bool? iii = new bool?();
            Console.WriteLine("i的值 {0}",i);
            Console.WriteLine("ii的值 {0}", ii); 
            Console.WriteLine("iii的值 {0}", iii);

            // ?? 是 Null 合并运算符
            int? nulli = null;
            int nullii;
            nullii = nulli ?? 1;
            Console.WriteLine("nullii的值 {0}", nullii);
        }
    }
    class DynamicMath{
        public dynamic Add(dynamic a, dynamic b)
        {
            return a + b;
        }
    }

}